public class Test {
    public static void main(String[] args) {
        String str = "adbcdd";
        System.out.println(firstUniqChar(str));
    }

    public static int firstUniqChar(String s) {//找出字符串中第一个只出现一次的字符
        if (s == null) return -1;//确保字符串不为空（>=1）

        int[] count = new int[26];//创建一个记数数组

        for (int i = 0; i < s.length(); i++) {//遍历字符串
            char ch = s.charAt(i);//取出字符串“下标为i”的字符
            count[ch - 'a']++;//字符的本质是数字，若ch为‘a’，则此处是在count的0下标处自加1，表示字符‘a’出现1次
        }

        for (int i = 0; i < s.length(); i++) {//再次遍历字符串
            char ch = s.charAt(i);//再次取出字符串中“下标为i”的字符
            if (count[ch - 'a'] == 1) {//经过count数组找出第1个只出现1次的字符
                return i;//返回其下标
            }
        }

        return -1;//找不到
    }

    /*
    找出字符串中第一个只出现1次的字符，博哥引导我们想出的第一个解决办法是“暴力算法”，即把i放在字符串0下标的位置，用j去遍历其后的字符，
    若第1次遍历出现i下标的字符等于j下标的字符，则第一个字符不符合条件，i++，j再从其后依次遍历，最坏的结果是j遍历了（length-1）次。

    第二个办法是创建一个记数数组count，里面相当于按顺序存放了26个字母（题目要求字符串全为小写字母），如此只需遍历两次。

    第1次遍历为依次取出字符串中的字符，找到count数组里该字符对应的下标位置，自加1，如此表示该字符出现了1次，遍历完该字符串后，
    count数组里各字符的位置内存放的数字就是该字符在字符串中出现的次数；

    第二次遍历也是依次取出字符串中的字符，通过count数组判断该字符在整个字符串中出现的次数，当第一个只出现1次的字符被找到，则返回它的下标，
    如此则完成了题目要求。

    这个算法的核心点在于count数组的创建及使用，count数组为记数数组，即记录每个字符出现的次数，因为题目要求字符串全为小写字母，
    所以count数组设置了26个字节的空间，每个空间代表每个小写字母的计数位置。

    如何按照字符找到它在count数组中的位置也是关键，count[ch - 'a']，字符的本质是数字，题目要求字符串全为小写字母，
    所以可以通过各字母与‘a’相减找到其相对位置，然后进行计数。
     */
}
